from django.shortcuts import render

# Create your views here.
from rest_framework.views import APIView
from rest_framework_jwt.settings import api_settings

from mall import settings
from urllib.parse import urlencode,parse_qs
from urllib.request import urlopen
from rest_framework.response import Response
from .utils import OauthQQ
from oauth.models import OAuthQQUser
from rest_framework import status
from .serializers import QQTokenSerializer
import logging

logger = logging.getLogger('meiduo')



class QQAuthURLView(APIView):
    """
    实现出现QQ授权登录视图
    GET /oauth/qq/statues/
    """

    def get(self,request):

        # 生成auth_url
        # https://graph.qq.com/oauth2.0/authorize
        # 请求参数请包含如下内容：
        # response_type   必须      授权类型，此值固定为“code”。
        # client_id       必须      申请QQ登录成功后，分配给应用的appid。
        # redirect_uri    必须      成功授权后的回调地址，必须是注册appid时填写的主域名下的地址，建议设置为网站首页或网站的用户中心。注意需要将url进行URLEncode。
        # state           必须      client端的状态值。用于第三方应用防止CSRF攻击，成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。
        # scope              可选      scope=get_user_info

        #获取state
        state = request.query_params.get('state')
        #设置base_url,注意添加 ?
        # base_url = 'https://graph.qq.com/oauth2.0/authorize?'
        #组织参数
        # params = {
        #     'response_type':'code',
        #     'client_id':settings.QQ_APP_ID,
        #     'redirect_uri':settings.QQ_REDIRECT_URL,
        #     'state':state,
        #     'scope':'get_user_info',
        # }

        #对参数进行urlencode,然后拼接url
        qq = OauthQQ()
        auth_url = qq.get_oauth_url(state)

        #返回响应
        return Response({'auth_url':auth_url})

class QQTokenView(APIView):

    def get(self,request):


        code = request.query_params.get('code')
        if code is None:
            return Response({'message':'缺少参数'},status=status.HTTP_400_BAD_REQUEST)

        qq = OauthQQ()

        access_token = qq.get_access_token(code)

        openid = qq.get_openid(access_token)

        # 根据openid来判断 用户是否绑定过
        # 如何判断呢？

        try:

            qquser = OAuthQQUser.objects.get(openid=openid)

        except OAuthQQUser.DoesNotExist:


            token = OAuthQQUser.genericte_openid_token(openid)

            return Response({'access_token':token})

            # 第一次授权 需要绑定
        else:

            # 已经绑定过了 直接登录  返回token
            # 返回登录的token
            # 生成已登录的token
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
            user = qquser.user
            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)

            response = Response({
                'token': token,
                'user_id': user.id,
                'username': user.username
            })

            return response

    def post(self,request):

        """
        当用户提交的时候 把手机号，密码，短信验证码，和access_token(openid)提交给后台
        后台对 短信验证码进行验证 在验证access_token，验证token之后可以 提前到 openid
        把入库
        """
#         创建序列化器
        serializer = QQTokenSerializer(data=request.data)

#         进行校验
        serializer.is_valid(raise_exception=True)

#         数据保存
        user = serializer.save()
#         返回登录的token
        # 生成已登录的token
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)

        response = Response({
            'token': token,
            'user_id': user.id,
            'username': user.username
        })

        return response






from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

# 初始化对象
# 第一个参数是 secret
# 第二个是时间
s = Serializer('123',3600)

# 将关键数据进行处理
dict = {
    'userid':1,
    'username':'itheima'
}

token = s.dumps(dict)

# 校验
s.loads(token)

# 有效期的问题
# 初始化对象
# 第一个参数是 secret
# 第二个是时间
s = Serializer('123',1)

# 将关键数据进行处理
dict = {
    'userid':1,
    'username':'itheima'
}

token = s.dumps(dict)

# 校验
s.loads(token)
#






